"""
В этом фале будут располагаться хендлеры, отвечающие за отображение меню бота, кроме тех, которые
вызывают непосредственный переход к генерации документов.
"""
import logging

from aiogram import types
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters import Text
from aiogram.dispatcher.filters.state import State, StatesGroup
from aiogram.types import ParseMode

import client_kb
import sqlite_db
from main import dp


class FSM(StatesGroup):
    create_menu = State()
    doc_type_select = State()
    create_uk_pass = State()
    create_ar_pass = State()
    create_br_pass = State()
    create_mx_pass = State()


logger = logging.getLogger(__name__)


@dp.message_handler(Text(equals=["Отменить", "Вернутся в меню ◀️"]), state="*")
@dp.message_handler(commands=["stop"], state="*")
async def cancel_command(message: types.Message, state: FSMContext):
    """
    Обработка возврата в главное меню через callback-кнопку
    """
    logger.info(f"Пользователь {message.from_user.username} вернулся в меню")
    user_id = message.from_user.id
    async with state.proxy() as data:
        try:
            await dp.bot.delete_message(chat_id=user_id, message_id=data["check_pay1"])
        except:
            pass
        try:
            await dp.bot.delete_message(chat_id=user_id, message_id=data["check_pay2"])
        except:
            pass
    current_state = await state.get_state()
    if current_state is None:
        await message.answer(
            f"Выход в меню", parse_mode="HTML", reply_markup=client_kb.kb_choice
        )
        return
    await state.finish()
    await message.answer(
        f"Выход в меню", parse_mode="HTML", reply_markup=client_kb.kb_choice
    )


@dp.message_handler(commands=["start"], state="*")
@dp.message_handler(Text(equals="Вернуться в бота"), state="*")
async def command_start(message: types.Message, state: FSMContext):
    """
    Команда отображения главного меню бота.
    """
    logger.info(f"Пользователь {message.from_user.username} вернулся в меню")
    user_id = message.from_user.id
    async with state.proxy() as data:
        try:
            await dp.bot.delete_message(chat_id=user_id, message_id=data["check_pay1"])
        except:
            pass
        try:
            await dp.bot.delete_message(chat_id=user_id, message_id=data["check_pay2"])
        except:
            pass
    await sqlite_db.check_user_in_db(user_id)
    await message.answer(
        f"Выберите действие", parse_mode="HTML", reply_markup=client_kb.kb_choice
    )


@dp.callback_query_handler(
    Text(
        equals=[
            "uk_exit",
            "ar_exit",
            "uk_exit_bill",
            "exit",
            "br_exit_id",
            "it_exit_id",
            "it_exit_bill",
            "it_exit_dl",
            "es_exit_passport",
            "mx_exit_bill",
            "mx_exit_pass",
            "mx_exit",
            "es_exit_id",
            "kz_exit_pass",
            "kz_exit_id_new",
            "est_exit_id" "kz_exit_id_old",
            "ar_exit_id",
            "ar_exit_pass",
            "de_exit_bill",
            "est_exit_bill",
            "de_exit_id",
            "br_exit_dl",
        ]
    ),
    state="*",
)
async def cancel_handler_inline(call: types.CallbackQuery, state: FSMContext):
    """
    Обработка выхода из меню после окончания процесса генерации
    """
    logger.info(
        f"Пользователь {call.from_user.username} вернулся в меню после генерации документа"
    )
    user_id = call.from_user.id
    async with state.proxy() as data:
        try:
            await dp.bot.delete_message(chat_id=user_id, message_id=data["check_pay1"])
        except:
            pass
        try:
            await dp.bot.delete_message(chat_id=user_id, message_id=data["check_pay2"])
        except:
            pass
    await state.finish()
    await state.reset_data()
    await call.message.answer(
        f"Выход в меню", parse_mode="HTML", reply_markup=client_kb.kb_choice
    )


@dp.message_handler(Text(equals="Создать документ 📄"))
async def command_create(message: types.Message):
    """
    Обработка начала создания документа, вывод условий соглашения
    """
    logger.info(f"Пользователь {message.from_user.username} начал создание документа")
    user_id = message.from_user.id
    await sqlite_db.check_user_in_db(user_id)
    await message.answer(
        "❗️ Внимание ❗️\n"
        "Оказанные услуги, несут развлекательный, ознакомительный и общий характер, без нарушения статей закона УК РФ, Статья 327; УК РФ, Статья 292; УК РФ, Статья 159 и Статья 137 УК РФ.\n\n"
        "Администрация не несёт ответственности за использование материала\n\n"
        "❗️ Нажимая кнопку 'Продолжить' вы принимаете все риски и ответственность за использование материала. ❗️\n\n"
        "🏷 price:\n"
        "<b>- Pass, ID - 600 руб;</b>\n"
        "<b>- Bill - 400 руб.</b>\n",
        reply_markup=client_kb.kb_inline_apply,
        parse_mode=ParseMode.HTML,
    )


@dp.callback_query_handler(Text(equals="apply"))
async def command_create_menu(call: types.CallbackQuery):
    """
    Обработка подтверждения условий соглашения.
    """
    logger.info(f"Пользователь {call.from_user.username} подтвердил условия соглашения")
    await call.message.delete()
    user_id = call.from_user.id
    await sqlite_db.sql_check_user(user_id)
    await call.message.answer("Выберите страну", reply_markup=client_kb.kb_counries)
    await FSM.create_menu.set()


async def command_create_menu_notcallback(message: types.Message):
    """
    Обработка подтверждения условий соглашения.
    """
    logger.info(
        f"Пользователь {message.from_user.username} подтвердил условия соглашения"
    )
    await message.delete()
    user_id = message.from_user.id
    await sqlite_db.sql_check_user(user_id)
    await message.answer("Выберите страну", reply_markup=client_kb.kb_counries)
    await FSM.create_menu.set()


@dp.message_handler(Text(equals="Назад ◀️"), state=FSM)
async def command_create_menu_button(message: types.Message):
    """
    Обработка нажатия на кнопку назад для возврата в меню выбора страны
    """
    logger.info(
        f"Пользователь {message.from_user.username} вернулся в меню выбора страны для генерации"
    )
    await message.delete()
    user_id = message.from_user.id
    await sqlite_db.sql_check_user(user_id)
    await message.answer("Выберите страну", reply_markup=client_kb.kb_counries)
    await FSM.create_menu.set()
